var widget = widget || { };
/**
 * Это абстрактный класс для виджетов полей.
 * Copyright 2012, Alexander Dashkovsky
 * License: http://www.opensource.org/licenses/mit-license.php
 * @lends widget.Control
 */
widget.Control = Base.extend({
	
	id : undefined,			// идентификатор объекта поля
	
	type : undefined,		// тип поля

	visible : true,			// признак того, что поле будет отображаться
	
	label : undefined,		// наименование поля
	
	value : undefined,		// значение поля

	/**
	 * Конструктор класса
	 * @augments Base
	 * @class Абстрактный класс, от которого наследуются все 
	 * виджеты управляющих элементов.
	 * 
	 * <p><b>Пример использования:</b></p>
	 * <pre class="code">
	 * widget.ColorPicker = widget.Control.extend({
	 * 	WIDGET_CLASS : 'wg_color',
	 *	constructor : function(config) {
	 *		this.config = config || {} ;
	 *		this.base(this.config.id, this.WIDGET_CLASS,
	 *			this.config.label, this.config.value);
	 *	},
	 * 	...
	 * });
	 * </pre>
	 * 
	 * @constructs
	 * @param {String} id Идентификатор поля.
	 * @param {String} type Тип поля.
	 * @param {String} label Наименование поля.
	 * @param {Object} value Значение поля.
	 */
	constructor : function(id, type, label, value) {
		this.id = (id)? id : type+'_'+this.generateId();
		this.type = type;
		this.label = label;
		this.value = value;
	},
	
	/**
	 * Эта функция возвращает идентификатор поля
     * @public 
	 * @function
     * @memberOf widget.Control#
	 * @return {int} - идентификатор поля
	 */
	getId : function() {
		return this.id;
	},
	
	/**
	 * Эта функция возвращает тип поля
     * @public 
	 * @function
     * @memberOf widget.Control#
	 * @return {string} - тип поля
	 */
	getType : function() {
		return this.type;
	},
	
	/**
	 * Возвращает признак видимости поля
     * @public 
	 * @function
     * @memberOf widget.Control#
	 * @return {boolean} - true, если объект должен быть показан. Иначе false.
	 */
	isVisible : function() {
		return this.visible;
	},
	
	/**
	 * Установить признак видимости поля.
     * @public 
	 * @function
     * @memberOf widget.Control#
	 * @param {boolean} visible признак доступности объекта.
	 * @return none
	 */
	setVisible : function(visible) {
		this.visible = visible;
	},
	
	/**
	 * Получить наименование поля.
     * @public 
	 * @function
     * @memberOf widget.Control#
	 */
	getLabel : function() {
		return this.label;
	},
	
	/**
	 * Установить наименование поля.
     * @public 
	 * @function
     * @memberOf widget.Control#
	 */
	setLabel : function(label) {
		this.label = label;
	},
	
	/**
	 * Получить значение поля.
     * @public 
	 * @function
     * @memberOf widget.Control#
	 */
	getValue : function() {
		return this.value;
	},
	
	/**
	 * Установить значение поля.
     * @public 
	 * @function
     * @memberOf widget.Control#
	 */
	setValue : function(value) {
		this.value = value;
	},
	
	/**
	 * Функция добавляет класс(классы) к элементу.
     * @function
     * @private 
	 */
	applyClassToElement : function(cls, element) {
		if (cls) {
			var arr = cls.split(' ');
			for (var i=0; i<arr.length; i++) {
				$(element).addClass(arr[i]);
			}
		}
	},
	
	/**
	 * Функция добавляет возможность класс css к элементу при 
	 * наведении на него мышкой.
     * @function
     * @private 
	 */
	applyOverClassToElement : function(cls, element) {
		if (cls) {
			$(element).hover(
				function (event) {
					$(this).addClass(cls);
				},
				function (event) {
					$(this).removeClass(cls);
				}
			);
		}
	},

    /**
     * @function
     * @private 
     * This function generate unique id using date-time, math round operation, reverse string
     * by length=10 chars
     * @return {string} id
    */
    generateId : function() {    
        return Math.round(((new Date()).getTime()+Math.random())*100).toString().split('').reverse().join('').substr(0,10);
    },

	/**
     * @public 
	 * @function
     * @memberOf widget.Control#
	 */
	toString : function() {
		return 'widget.control.Control:{"'+this.getType()+'":{"id":"'+this.getId()+'","label":"'+
				this.getLabel()+'","value":"'+this.getValue()+'"}}'
	}

});
